<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Function template public_function</title>
<link rel="stylesheet" href="../../../../../../doc/src/boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
<link rel="home" href="../../index.html" title="Chapter 1. Boost.Contract 1.0.0">
<link rel="up" href="../../reference.html#header.boost.contract.public_function_hpp" title="Header &lt;boost/contract/public_function.hpp&gt;">
<link rel="prev" href="public_f_idm45125847781408.html" title="Function template public_function">
<link rel="next" href="public_f_idm45125847738960.html" title="Function template public_function">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr>
<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../boost.png"></td>
<td align="center"><a href="../../../../../../index.html">Home</a></td>
<td align="center"><a href="../../../../../../libs/libraries.htm">Libraries</a></td>
<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
<td align="center"><a href="../../../../../../more/index.htm">More</a></td>
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="public_f_idm45125847781408.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../../reference.html#header.boost.contract.public_function_hpp"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="public_f_idm45125847738960.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
<div class="refentry">
<a name="boost.contract.public_f_idm45125847762768"></a><div class="titlepage"></div>
<div class="refnamediv">
<h2><span class="refentrytitle">Function template public_function</span></h2>
<p>boost::contract::public_function — Program contracts for non-void virtual public functions that do not override. </p>
</div>
<h2 xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv-title">Synopsis</h2>
<div xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv"><pre class="synopsis"><span class="comment">// In header: &lt;<a class="link" href="../../reference.html#header.boost.contract.public_function_hpp" title="Header &lt;boost/contract/public_function.hpp&gt;">boost/contract/public_function.hpp</a>&gt;

</span>
<span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> VirtualResult<span class="special">,</span> <span class="keyword">typename</span> Class<span class="special">&gt;</span> 
  <a class="link" href="specify__idm45125848100512.html" title="Class template specify_precondition_old_postcondition_except">specify_precondition_old_postcondition_except</a><span class="special">&lt;</span> <span class="identifier">VirtualResult</span> <span class="special">&gt;</span> 
  <span class="identifier">public_function</span><span class="special">(</span><a class="link" href="virtual_.html" title="Class virtual_">virtual_</a> <span class="special">*</span> v<span class="special">,</span> <span class="identifier">VirtualResult</span> <span class="special">&amp;</span> r<span class="special">,</span> <span class="identifier">Class</span> <span class="special">*</span> obj<span class="special">)</span><span class="special">;</span></pre></div>
<div class="refsect1">
<a name="idm45885983446160"></a><h2>Description</h2>
<p>This is used to specify preconditions, postconditions, exception guarantees, old value copies at body, and check class invariants for public functions that are virtual, do not override, and do not return <code class="computeroutput">void:</code> </p>
<pre class="programlisting"><span class="keyword">class</span> <span class="identifier">u</span> <span class="special">{</span>
    <span class="keyword">friend</span> <span class="keyword">class</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">access</span><span class="special">;</span>

    <span class="keyword">void</span> <span class="identifier">invariant</span><span class="special">(</span><span class="special">)</span> <span class="keyword">const</span> <span class="special">{</span> <span class="comment">// Optional (as for static and volatile).</span>
        <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="special">...</span><span class="special">)</span><span class="special">;</span>
        <span class="special">...</span>
    <span class="special">}</span>

<span class="keyword">public</span><span class="special">:</span>
    <span class="identifier">t</span> <span class="identifier">f</span><span class="special">(</span><span class="special">...</span><span class="special">,</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">virtual_</span><span class="special">*</span> <span class="identifier">v</span> <span class="special">=</span> <span class="number">0</span><span class="special">)</span> <span class="special">{</span>
        <span class="identifier">t</span> <span class="identifier">result</span><span class="special">;</span>
        <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">old_ptr</span><span class="special">&lt;</span><span class="identifier">old_type</span><span class="special">&gt;</span> <span class="identifier">old_var</span><span class="special">;</span>
        <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">check</span> <span class="identifier">c</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">contract</span><span class="special">::</span><span class="identifier">public_function</span><span class="special">(</span>
                <span class="identifier">v</span><span class="special">,</span> <span class="identifier">result</span><span class="special">,</span> <span class="keyword">this</span><span class="special">)</span>
            <span class="special">.</span><span class="identifier">precondition</span><span class="special">(</span><span class="special">[</span><span class="special">&amp;</span><span class="special">]</span> <span class="special">{</span> <span class="comment">// Optional.</span>
                <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="special">...</span><span class="special">)</span><span class="special">;</span>
                <span class="special">...</span>
            <span class="special">}</span><span class="special">)</span>
            <span class="special">.</span><span class="identifier">old</span><span class="special">(</span><span class="special">[</span><span class="special">&amp;</span><span class="special">]</span> <span class="special">{</span> <span class="comment">// Optional.</span>
                <span class="identifier">old_var</span> <span class="special">=</span> <span class="identifier">BOOST_CONTRACT_OLDOF</span><span class="special">(</span><span class="identifier">v</span><span class="special">,</span> <span class="identifier">old_expr</span><span class="special">)</span><span class="special">;</span>
                <span class="special">...</span>
            <span class="special">}</span><span class="special">)</span>
            <span class="special">.</span><span class="identifier">postcondition</span><span class="special">(</span><span class="special">[</span><span class="special">&amp;</span><span class="special">]</span> <span class="special">(</span><span class="identifier">t</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">result</span><span class="special">)</span> <span class="special">{</span> <span class="comment">// Optional.</span>
                <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="special">...</span><span class="special">)</span><span class="special">;</span>
                <span class="special">...</span>
            <span class="special">}</span><span class="special">)</span>
            <span class="special">.</span><span class="identifier">except</span><span class="special">(</span><span class="special">[</span><span class="special">&amp;</span><span class="special">]</span> <span class="special">{</span> <span class="comment">// Optional.</span>
                <span class="identifier">BOOST_CONTRACT_ASSERT</span><span class="special">(</span><span class="special">...</span><span class="special">)</span><span class="special">;</span>
                <span class="special">...</span>
            <span class="special">}</span><span class="special">)</span>
        <span class="special">;</span>

        <span class="special">...</span> <span class="comment">// Function body (use `return result = return_expr`).</span>
    <span class="special">}</span>
    
    <span class="special">...</span>
<span class="special">}</span><span class="special">;</span>
</pre>
<p>A virtual public function should always call  <code class="computeroutput"><code class="computeroutput"><a class="link" href="public_f_idm45125847806592.html" title="Function template public_function">boost::contract::public_function</a></code></code> otherwise this library will not be able to correctly use it for subcontracting.</p>
<p><span class="bold"><strong>See Also:</strong></span></p>
<p> <a class="link" href="../../boost_contract/tutorial.html#boost_contract.tutorial.virtual_public_functions" title="Virtual Public Functions"> Virtual Public Functions</a></p>
<p>
</p>
<p>



</p>
<div class="variablelist"><table border="0" class="variablelist compact">
<colgroup>
<col align="left" valign="top">
<col>
</colgroup>
<tbody>
<tr>
<td><p><span class="term">Parameters:</span></p></td>
<td><div class="variablelist"><table border="0" class="variablelist compact">
<colgroup>
<col align="left" valign="top">
<col>
</colgroup>
<tbody>
<tr>
<td><p><span class="term"><code class="computeroutput">obj</code></span></p></td>
<td><p>The object <code class="computeroutput">this</code> from the scope of the enclosing virtual public function declaring the contract. This object might be mutable, <code class="computeroutput">const</code>, <code class="computeroutput">volatile</code>, or <code class="computeroutput">const volatile</code> depending on the cv-qualifier of the enclosing function (volatile public functions will check volatile class invariants, see  <a class="link" href="../../boost_contract/extras.html#boost_contract.extras.volatile_public_functions" title="Volatile Public Functions">
            Volatile Public Functions</a>).</p></td>
</tr>
<tr>
<td><p><span class="term"><code class="computeroutput">r</code></span></p></td>
<td><p>A reference to the return value of the enclosing virtual public function declaring the contract. This is usually a local variable declared by the enclosing virtual public function just before the contract, but programmers must set it to the actual value being returned by the function at each <code class="computeroutput">return</code> statement. </p></td>
</tr>
<tr>
<td><p><span class="term"><code class="computeroutput">v</code></span></p></td>
<td><p>The trailing parameter of type  <code class="computeroutput"><code class="computeroutput"><a class="link" href="virtual_.html" title="Class virtual_">boost::contract::virtual_</a></code></code><code class="computeroutput">*</code> and default value <code class="computeroutput">0</code> from the enclosing virtual public function. </p></td>
</tr>
</tbody>
</table></div></td>
</tr>
<tr>
<td><p><span class="term">Template Parameters:</span></p></td>
<td><div class="variablelist"><table border="0" class="variablelist compact">
<colgroup>
<col align="left" valign="top">
<col>
</colgroup>
<tbody>
<tr>
<td><p><span class="term"><code class="computeroutput">Class</code></span></p></td>
<td><p>The type of the class containing the virtual public function declaring the contract. (Usually this template parameter is automatically deduced by C++ and it does not need to be explicitly specified by programmers.)</p></td>
</tr>
<tr>
<td><p><span class="term"><code class="computeroutput">VirtualResult</code></span></p></td>
<td><p>This type must be the same as, or compatible with, the return type of the enclosing virtual public function declaring the contract (this library might not be able to generate a compile-time error if these types mismatch, but in general that will cause run-time errors or undefined behaviour). Alternatively, <code class="computeroutput">boost::optional&lt;<span class="emphasis"><em>return-type</em></span>&gt;</code> can also be used (see  <a class="link" href="../../boost_contract/advanced.html#boost_contract.advanced.optional_return_values" title="Optional Return Values">
                        Optional Return Values</a>). (Usually this template parameter is automatically deduced by C++ and it does not need to be explicitly specified by programmers.) </p></td>
</tr>
</tbody>
</table></div></td>
</tr>
<tr>
<td><p><span class="term">Returns:</span></p></td>
<td><p>The result of this function must be assigned to a variable of type  <code class="computeroutput"><a class="link" href="check.html" title="Class check">boost::contract::check</a></code> declared explicitly (i.e., without using C++11 <code class="computeroutput">auto</code> declarations) and locally just before the code of the public function body (otherwise this library will generate a run-time error, see  <code class="computeroutput"><a class="link" href="../../BOOST_CO_idm45125848615536.html" title="Macro BOOST_CONTRACT_ON_MISSING_CHECK_DECL">BOOST_CONTRACT_ON_MISSING_CHECK_DECL</a></code>). </p></td>
</tr>
</tbody>
</table></div>
</div>
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"></td>
<td align="right"><div class="copyright-footer">Copyright © 2008-2019 Lorenzo Caminiti<p>
        Distributed under the Boost Software License, Version 1.0 (see accompanying
        file LICENSE_1_0.txt or a copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
      </p>
</div></td>
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="public_f_idm45125847781408.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../../reference.html#header.boost.contract.public_function_hpp"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="public_f_idm45125847738960.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
</div>
</body>
</html>
